﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DoctorWorld
{
    class Archivador
    {
        private List<Ficha> listaFichas;

        public double Count
        {
            get { return this.listaFichas.Count; }
        }

        public Archivador()
        {
            this.listaFichas = new List<Ficha>();
        }

        public void BuildFromDirectory(String directoryPath, String name, int fromNumericID, int toNumericID, String extension)
        {
            String completePath;
            for (int i = fromNumericID; i <= toNumericID; i++)
            {
                completePath = directoryPath + name + i.ToString() + extension;
                Ficha aux = new Ficha(); 
                aux.BuildFromFile(completePath);
                this.listaFichas.Add(aux);
            }
        }

        public void Add(Ficha ficha)
        {
            bool isThere = false;
            int i = 0;

            while ((isThere == false) && (i < this.listaFichas.Count))
            {
                if (this.listaFichas.ElementAt(i).FilePath.CompareTo(ficha.FilePath) == 0)
                    isThere = true;
                i++;
            }

            if (!isThere)
            {
                this.listaFichas.Add(ficha);
                return;
            }

            this.listaFichas.ElementAt(i).Nombre = ficha.Nombre;
            this.listaFichas.ElementAt(i).Apellido = ficha.Apellido;
            this.listaFichas.ElementAt(i).TipoDoc = ficha.TipoDoc;
            this.listaFichas.ElementAt(i).NumDoc = ficha.NumDoc;
            this.listaFichas.ElementAt(i).Domicilio = ficha.Domicilio;
            this.listaFichas.ElementAt(i).Telefono = ficha.Telefono;
            this.listaFichas.ElementAt(i).Celular = ficha.Celular;
            this.listaFichas.ElementAt(i).DiaNacimiento = ficha.DiaNacimiento;
            this.listaFichas.ElementAt(i).MesNacimiento = ficha.MesNacimiento;
            this.listaFichas.ElementAt(i).AnoNacimiento = ficha.AnoNacimiento;
            this.listaFichas.ElementAt(i).Sexo = ficha.Sexo;
            this.listaFichas.ElementAt(i).ObraSocial = ficha.ObraSocial;
            this.listaFichas.ElementAt(i).NumObraSocial = ficha.NumObraSocial;
            this.listaFichas.ElementAt(i).NumHistoriaClinica = ficha.NumHistoriaClinica;
            this.listaFichas.ElementAt(i).Observaciones = ficha.Observaciones;
        }

        public Ficha ElementAt(int indice)
        {
            return this.listaFichas.ElementAt(indice);
        }

        public void RemoveAt(int indice)
        {
            this.listaFichas.RemoveAt(indice);
        }

        private void OrdenarListaPorApellidoYDNI()
        {
            List<Ficha> listaAux = new List<Ficha>();

            for (int i = 0; i < this.listaFichas.Count; i++)
                for (int j = 0; j < this.listaFichas.Count; j++)
                {
                    if (i != j)
                        if (this.listaFichas.ElementAt(i).Apellido.CompareTo(this.listaFichas.ElementAt(j).Apellido) == -1)
                        {
                            listaAux.Add(this.listaFichas.ElementAt(i));
                            this.listaFichas.RemoveAt(i);
                        }
                }
            listaFichas = listaAux;
        }

        public Ficha BuscarFichaPorNumDoc(String NumDoc)
        {
            int j = 0;
            while ((j < this.listaFichas.Count))
            {
                if (this.listaFichas.ElementAt(j).NumDoc == NumDoc)
                {
                    return this.listaFichas.ElementAt(j);
                }
                j++;
            }
            throw new IndexOutOfRangeException();
        }

        public void OrdenarPorApellidoYNumDoc()
        {
            if (this.listaFichas.Count <= 1)
                return;

            this.listaFichas.Sort(ComparadorApellidos);

            String apellidoActual;
            List<Ficha> miniSort = new List<Ficha>();
            List<Ficha> complete = new List<Ficha>();
            int i = 0;

            while (i < this.listaFichas.Count)
            {
                apellidoActual = this.listaFichas.ElementAt(i).Apellido;
                while ( (i < this.listaFichas.Count) && (apellidoActual.CompareTo(this.listaFichas.ElementAt(i).Apellido) == 0) )
                {
                    miniSort.Add(this.listaFichas.ElementAt(i));
                    i++;
                }
                miniSort.Sort(ComparadorNumDoc);
                complete.AddRange(miniSort);
                miniSort.Clear();
            }

            this.listaFichas = complete;
        }

        private int ComparadorApellidos(Ficha x, Ficha y)
        {
            if (x.Apellido.CompareTo(y.Apellido) == -1)
                return -1;

            if (x.Apellido.CompareTo(y.Apellido) == 0)
                return 0;

            return 1;
        }

        private int ComparadorNumDoc(Ficha x, Ficha y)
        {
            if (int.Parse(x.NumDoc) < int.Parse(y.NumDoc))
                return -1;

            if (int.Parse(x.NumDoc) == int.Parse(y.NumDoc))
                return 0;

            return 1;
        }
    }
}
